home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue31 / hash2 / TstHshRM.dpr < prev   
Encoding:
Text File  |  1997-11-29  |  4.3 KB  |  160 lines

  1. program TstHshRM;
  2.  
  3. {$IFDEF Win32}
  4. {$APPTYPE CONSOLE}
  5. {$ENDIF}
  6.  
  7. uses
  8.   {$IFDEF Windows}
  9.   WinCrt,
  10.   {$ENDIF}
  11.   SysUtils,
  12.   HashRecM;
  13.  
  14. type
  15.   TTestRecord = packed record
  16.     Name : string[31];
  17.     Ext  : longint;
  18.   end;
  19.  
  20. function CalcELFHash(const S : string) : longint; far;
  21. var
  22.   G : longint;
  23.   i : integer;
  24. begin
  25.   Result := 0;
  26.   for i := 1 to length(S) do begin
  27.     Result := (Result shl 4) + ord(S[i]);
  28.     G := Result and $F0000000;
  29.     if (G <> 0) then
  30.       Result := Result xor (G shr 24);
  31.     Result := Result and (not G);
  32.   end;
  33. end;
  34.  
  35. function GetKey(const aRecord) : string; far;
  36. begin
  37.   Result := TTestRecord(aRecord).Name;
  38. end;
  39.  
  40. const
  41.   TPEmployees : array [0..32] of string[15] =
  42.     ('Antypas',          'Bolduc',           'Brady',
  43.      'Bucknall',         'Cappellucci',      'Cope',
  44.      'DelRossi',         'Douglas',          'Fairweather',
  45.      'Foley',            'Frerking',         'Geiger',
  46.      'Ghinaudo',         'Horaz',            'Huffman',
  47.      'Hughes',           'Inman',            'Kokkonen',
  48.      'Larsen',           'Leier',            'Medlin',
  49.      'Milner',           'Phillips',         'Reisdorph',
  50.      'Roberts',          'Rogers',           'Rose',
  51.      'Salisbury',        'Trickey',          'Troxell',
  52.      'Turner',           'Warner',           'Welch');
  53.  
  54. var
  55.   i, j : longint;
  56.   Database : ThrmHashRecordManager;
  57.   SaveRandSeed : longint;
  58.   MyRec : TTestRecord;
  59.   Name  : string[31];
  60.  
  61. begin
  62.   if FileExists('TEST.HTD') then DeleteFile('TEST.HTD');
  63.   Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 2039, CalcELFHash, GetKey);
  64.   try
  65.     {add all employee names}
  66.     for i := 0 to 32 do begin
  67.       FillChar(MyRec, sizeof(MyRec), 0);
  68.       MyRec.Name := TPEmployees[i];
  69.       MyRec.Ext := 12300 + i;
  70.       Database.Insert(MyRec);
  71.     end;
  72.   finally
  73.     Database.Free;
  74.   end;
  75.   readln;
  76.   Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
  77.   try
  78.     {get all employee names}
  79.     for i := 0 to 32 do begin
  80.       if Database.Find(TPEmployees[i], MyRec) then
  81.         writeln(MyRec.Name)
  82.       else begin
  83.         writeln('***NOT FOUND***', TPEmployees[i]);
  84.         readln;
  85.       end;
  86.     end;
  87.     {delete the first ten employee names}
  88.     for i := 0 to 9 do
  89.       Database.Delete(TPEmployees[i]);
  90.     {get all remaining employee names}
  91.     for i := 10 to 32 do begin
  92.       if Database.Find(TPEmployees[i], MyRec) then
  93.         writeln(MyRec.Name)
  94.       else begin
  95.         writeln('***NOT FOUND***', TPEmployees[i]);
  96.         readln;
  97.       end;
  98.     end;
  99.   finally
  100.     Database.Free;
  101.   end;
  102.   readln;
  103.   Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
  104.   try
  105.     {add the first ten employee names back in reverse order}
  106.     for i := 9 downto 0 do begin
  107.       FillChar(MyRec, sizeof(MyRec), 0);
  108.       MyRec.Name := TPEmployees[i];
  109.       MyRec.Ext := 1200 + i;
  110.       Database.Insert(MyRec);
  111.     end;
  112.     {get all employee names}
  113.     for i := 0 to 32 do begin
  114.       if Database.Find(TPEmployees[i], MyRec) then
  115.         writeln(MyRec.Name)
  116.       else begin
  117.         writeln('***NOT FOUND***', TPEmployees[i]);
  118.         readln;
  119.       end;
  120.     end;
  121.   finally
  122.     Database.Free;
  123.   end;
  124.   readln;
  125.   Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
  126.   try
  127.     writeln('add 50000 random names');
  128.     SaveRandSeed := RandSeed;
  129.     for i := 0 to 49999 do begin
  130.       FillChar(MyRec, sizeof(MyRec), 0);
  131.       MyRec.Name[0] := #10;
  132.       for j := 1 to 10 do
  133.         MyRec.Name[j] := char(random(26) + ord('A'));
  134.       MyRec.Ext := 900000 + i;
  135.       Database.Insert(MyRec);
  136.     end;
  137.     writeln('read 50000 random names');
  138.     RandSeed := SaveRandSeed;
  139.     for i := 0 to 49999 do begin
  140.       Name[0] := #10;
  141.       for j := 1 to 10 do
  142.         Name[j] := char(random(26) + ord('A'));
  143.       if not Database.Find(Name, MyRec) then begin
  144.         writeln('***NOT FOUND***', Name);
  145.         readln;
  146.       end;
  147.     end;
  148.     writeln('get all employee names');
  149.     for i := 0 to 32 do begin
  150.       if not Database.Find(TPEmployees[i], MyRec) then begin
  151.         writeln('***NOT FOUND***', TPEmployees[i]);
  152.         readln;
  153.       end;
  154.     end;
  155.   finally
  156.     Database.Free;
  157.   end;
  158.   readln;
  159. end.
  160.